package com.clps.designPatterns.chapter01.依赖倒转原则;

/**
 * 高层模式不应该依赖底层模块.两者应该依赖抽象,抽象不应该依赖细节,细节应该依赖抽象,中心思想是面向接口编程.
 */
public class C01_FarmFactory {
    public static void main(String[] args) {

        Animal animal = new Dog();
        Farming farm = new Farming();
        farm.breed(animal);
        animal = new Pig();
        farm.breed(animal);
    }
}

/**
 * 前端声明依赖接口
 */
interface  FarmFactory{
    void breed(Animal animal);
}

class Farming implements  FarmFactory{

    @Override
    public void breed(Animal animal) {
        System.out.println("农场饲养"+animal.getAnimalName());
    }
}

interface  Animal{
    String getAnimalName();
}

class Dog implements  Animal{

    @Override
    public String getAnimalName() {
        return "牧羊犬";
    }
}

class Pig implements  Animal{

    @Override
    public String getAnimalName() {
        return "土猪壹号";
    }
}
/**
 * 相对于系统开发的多变性,抽象的相对稳定比较好,以抽象为基础搭建的架构和细节为基础的架构要稳定灵活,下层模块尽量要抽象类和接口,程序稳定性更好,变量成名的类型和接口,这样变量引用的实际对象之间存在一个过渡空间,利于程序的扩展和优化
 *
 */
